/*** 
 * @_______________#########_______________________ 
 * @______________############_____________________ 
 * @______________#############____________________ 
 * @_____________##__###########___________________ 
 * @____________###__######_#####__________________ 
 * @____________###_#######___####_________________ 
 * @___________###__##########_####________________ 
 * @__________####__###########_####_______________ 
 * @________#####___###########__#####_____________ 
 * @_______######___###_########___#####___________ 
 * @_______#####___###___########___######_________ 
 * @______######___###__###########___######_______ 
 * @_____######___####_##############__######______ 
 * @____#######__#####################_#######_____ 
 * @____#######__##############################____ 
 * @___#######__######_#################_#######___ 
 * @___#######__######_######_#########___######___ 
 * @___#######____##__######___######_____######___ 
 * @___#######________######____#####_____#####____ 
 * @____######________#####_____#####_____####_____ 
 * @_____#####________####______#####_____###______ 
 * @______#####______;###________###______#________ 
 * @________##_______####________####______________ 
 * @
 * @Author: ipk518 121206530@qq.com
 * @Date: 2025-03-06 20:00:55
 * @LastEditors: ipk518 121206530@qq.com
 * @LastEditTime: 2025-10-18 11:00:26
 * @FilePath: /etws-sxk2307/inc/hrServer.h
 * @Description: 
 * @你把时间投在专业上，两三年，你就能在圈子里小有名气。四五年，你就能靠这个专业赚钱。过了10年以上，你就能成为这个领域的专家
 * @Copyright (c) 2025 by etws@quyujiang, All Rights Reserved. 
 */

#ifndef _HEARTBERT_
#define _HEARTBERT_

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <vector>
#include <mutex>
#include <utility>

#include "commHeader.h"

#define HEARTBEAT_DEADLINE_SEC  60


struct devAlive
{
    bool operator==(const devAlive& str)//赋值运算符 
    {
        if(this->m_devType == str.m_devType && this->m_devId == str.m_devId)
        {
            return true;
        }
        return false;
    }
    int64_t m_lastDataTime;//最后一次更新的时间
    uint8_t m_devType;
    uint8_t m_devId; 
};

class hrServer
{  
public:
    hrServer() = default;
    ~hrServer();
    
private:
    struct cmdDataType hrCmd;
    CallbackCmdFun cmdFun;
    int64_t m_lastAliveTime = 0;//用于记录发送了多少次心跳包
    std::vector<std::pair<uint8_t,uint8_t>> m_conDevice;
    std::vector<std::pair<bool,devAlive>> m_devAlive;
    static void doHeartbeatCheck(int64_t nowTime, std::pair<bool,devAlive>& dev);
    static void updateHeartbeat(std::pair<bool,devAlive>& Old, devAlive& New);
public:
    void Init(CallbackCmdFun to);
    void Run();
    void keepAlive(privateData& src);
    bool isAlive(uint8_t devType, uint8_t devId);
    void setAlive(uint8_t devType, uint8_t devId, bool isAlive);
};



#endif